package day240123

import "fmt"

// 通过数组产生切片
func M通过数组产生切片和删除切片() {
	//定义数组后，取出数组中一个片段，这个片段就是切片类型

	names := [5]string{"aa", "bb", "cc", "dd", "ee"}
	s := names[0:2]                      //从下标 0 开始 包括 0 ， 切到 下标2 不包括2
	fmt.Printf("%T\n", s)                //[]string
	fmt.Println(s, "切片后的names:", names)  //[aa bb] 切片后的names: [aa bb cc dd ee] 切片不影响原数组
	fmt.Printf("%p %p \n", s, &names[0]) //0x98aa000 0x98aa000

	tow_s := names[2:4]                     //从下标 2 开始 包括 2 ， 切到 下标4 不包括4
	fmt.Println(tow_s, "切片后的names:", names) //[cc dd]切片后的names: [aa bb cc dd ee] 切片不影响原数组
	//切片是指针, 指针地址就是 下标0 的元素的地址

	//数组改变，切片也跟着变：切片是数组切下来一部分，属于数组一部分，所以也是指向数组，
	//当数组改了，切片是数组一部分，所以也改
	s[0] = "6"
	fmt.Println(names, s) //[6 bb cc dd ee] [6 bb]

	//如果切片变了， 数组也会变
	s = append(s, "7")    //这里是s[2]
	fmt.Println(names, s) //[6 bb 7 dd ee] [6 bb 7]

	//切片增加时：如果不超过数组长度： 数组跟着变
	s = append(s, "8", "9")
	fmt.Println(names, s) //[6 bb 7 8 9] [6 bb 7 8 9]

	//切片增加时：如果超过了数组长度：切片新加空间，地址改变，数组不会变
	fmt.Printf("切片增加前 %p %p \n", &names[0], s) // 切片和数组地址一样
	s = append(s, "7", "8", "9", "10")
	fmt.Println(names, s)                            //[6 bb 7 dd ee] [6 bb 7 7 8 9 10]
	fmt.Printf("切片增加后，并超过数组 %p %p \n", &names[0], s) //切片地址变了
}
